/*
 * Copyright (c) 2008-2009 Ravenhearte Design
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'Ravenhearte Design' nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.ravenhearte.hardboild.gui;

import java.nio.FloatBuffer;

import com.jme.image.Texture;
import com.jme.math.Vector3f;
import com.jme.scene.Spatial;
import com.jme.scene.TexCoords;
import com.jme.scene.shape.Quad;
import com.jme.scene.state.TextureState;
import com.jme.system.DisplaySystem;
import com.jme.util.TextureManager;
import com.jme.util.geom.BufferUtils;

public class ImageElement extends Element {
	protected Quad spatial;
	
	public ImageElement(String name, int width, int height) {
		super(name);
		spatial = new Quad(name, width, height);
		setSize(width, height);
	}

	public Spatial getSpatial() {
		return spatial;
	}

	protected void resize(int width, int height) {
		spatial.resize(width, height);
		setLocation(x, y);
	}

	public void setLocation(int x, int y) {
		int screenHeight = DisplaySystem.getDisplaySystem().getHeight();

		this.x = x;
		this.y = y;
		
		int lowerX, lowerY;
		lowerX = 0;
		lowerY = y;
		
		switch (getAlignment()) {
		case LEFT:
			lowerX = x;
			break;
		case RIGHT:
			lowerX = x - getWidth();
			break;
		case CENTERED:
			lowerX = x - (getWidth() / 2);
			break;
		}
		
		spatial.setLocalTranslation(new Vector3f(lowerX + (spatial.getWidth() / 2),
				(screenHeight - lowerY) - (spatial.getHeight() / 2), 0));
		
		setLowerX(lowerX);
		setLowerY(lowerY);
	}
	
	public void setTexture(String filename, int x, int y) {
		DisplaySystem display = DisplaySystem.getDisplaySystem();
		
		int textureWidth, textureHeight;
        
		// create the texture state to handle the texture
		final TextureState ts = display.getRenderer().createTextureState();
		// load the image as a texture (the image should be placed in the same directory as this class)
		final Texture texture = TextureManager.loadTexture(
                ImageElement.class.getClassLoader().getResource("assets/art/images/"+filename),
                Texture.MinificationFilter.Trilinear, // of no use for the quad
                Texture.MagnificationFilter.Bilinear, // of no use for the quad
                1.0f,
                true);
        // set the texture for this texture state
        ts.setTexture(texture);
        // initialize texture width
        textureWidth = ts.getTexture().getImage().getWidth();
        // initialize texture height
        textureHeight = ts.getTexture().getImage().getHeight();
        // activate the texture state
        ts.setEnabled(true); 

        // correct texture application:
        final FloatBuffer texCoords = BufferUtils.createVector2Buffer(4);
        
        texCoords.put((float)x / textureWidth).put(
        		1 - (float) y / textureHeight);
        
        texCoords.put((float)x / textureWidth).put(
        		1 - (float) (y + spatial.getHeight()) / textureHeight);
        
        texCoords.put((float)(x +  spatial.getWidth()) / textureWidth).put(
        		1 - (float) (y + spatial.getHeight()) / textureHeight);
        
        texCoords.put((float)(x +  spatial.getWidth()) / textureWidth).put(
        		1 - (float) y / textureHeight);

        // assign texture coordinates to the quad
        spatial.setTextureCoords(new TexCoords(texCoords));
        // apply the texture state to the quad
        spatial.setRenderState(ts);
	}
}